package com.huimingpay.merchant.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.huimingpay.common.domain.BusinessException;
import com.huimingpay.common.domain.CommonErrorCode;
import com.huimingpay.common.util.RandomUuidUtil;
import com.huimingpay.common.util.StringUtil;
import com.huimingpay.merchant.api.AppService;
import com.huimingpay.merchant.convert.AppConvert;
import com.huimingpay.merchant.dto.AppDTO;
import com.huimingpay.merchant.entity.App;
import com.huimingpay.merchant.entity.Merchant;
import com.huimingpay.merchant.mapper.AppMapper;
import com.huimingpay.merchant.mapper.MerchantMapper;
import org.apache.dubbo.config.annotation.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * ClassName:AppServiceImpl
 * Package:com.huimingpay.merchant.service
 * Time: 2024/7/23
 */

@Service // 声明为dubbo服务
public class AppServiceImpl implements AppService {
    @Resource
    AppMapper appMapper;

    @Resource
    MerchantMapper merchantMapper;

    /**
     * 商户创建应用
     *
     * @param merchantId 商户id
     * @param appDTO     创建应用参数，app应用信息
     * @return 返回创建的应用信息
     * @throws BusinessException
     */
    @Override
    public AppDTO createApp(Long merchantId, AppDTO appDTO) throws BusinessException {
        // 1.校验参数
        //校验是否传入对象为空或者缺少必要的参数
        if (merchantId == null || appDTO == null || StringUtil.isBlank(appDTO.getAppName())) {
            throw new BusinessException(CommonErrorCode.E_300009); // 参数不完整
        }
        //校验该商户是否通过审核，根据商户的状态码判断，顺便判断商户是否存在
        Merchant merchant = merchantMapper.selectById(merchantId);
        if (merchant == null) {
            throw new BusinessException(CommonErrorCode.E_200002); // 商户不存在
        }
        if (!"2".equals(merchant.getAuditStatus())) {
            throw new BusinessException(CommonErrorCode.E_200003); // 商户未通过审核
        }
        //校验商户是否已经创建应用
        LambdaQueryWrapper<App> queryWrapper = new LambdaQueryWrapper<>();
        Integer count = appMapper.selectCount(queryWrapper.eq(App::getAppName, appDTO.getAppName()));
        if (count.intValue() > 0) {
            throw new BusinessException(CommonErrorCode.E_200004); // 商户已经创建应用
        }

        // 2.创建应用
        // 由于前端只传给AppDTO的appName,publlicKey,其他字段都是空
        // 主键Id由数据库自动生成,appId用UUID工具生成,merchantId直接传入，notifyUrl先不传
        appDTO.setAppId(RandomUuidUtil.getUUID());
        appDTO.setMerchantId(merchant.getId());
        // DTO转Entity
        App appEntity = AppConvert.INSTANCE.DTOToEntity(appDTO);
        // 保存到数据库
        appMapper.insert(appEntity);
        // 3.返回创建的应用信息,DTO转Entity
        return AppConvert.INSTANCE.EntityToDTO(appEntity);
    }

    /**
     * 根据商户id查询应用信息
     *
     * @param merchantId 商户id
     * @return 返回商户下所有应用信息
     * @throws BusinessException
     */
    @Override
    public List<AppDTO> queryAppsByMerchantId(Long merchantId) throws BusinessException {
        LambdaQueryWrapper<App> queryWrapper = new LambdaQueryWrapper<App>().eq(App::getMerchantId, merchantId);
        List<App> appEntities = appMapper.selectList(queryWrapper);
        // 返回应用信息DTO
        return AppConvert.INSTANCE.EntityListToDTOList(appEntities);
    }

    /**
     * 根据appId查询应用
     *
     * @param appId 应用id
     * @return 返回应用信息
     * @throws BusinessException
     */
    @Override
    public AppDTO getAppByAppId(String appId) throws BusinessException {
        App app = appMapper.selectOne(new LambdaQueryWrapper<App>().eq(App::getAppId, appId));
        // 返回应用信息DTO
        return AppConvert.INSTANCE.EntityToDTO(app);
    }
}
